﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

namespace ClassLibraryServer.Datos
{
    public class DLUsuarios
    {
        //###############################################################################
        //##########                    ATRIBUTOS Y PROPIEDADES                ##########
        //###############################################################################

        private SqlConnection connection;

        //###############################################################################
        //##########                    CONSTRUCTORES                          ##########
        //###############################################################################

        #region Constructor Singlenton
        private static DLUsuarios instance = null;
        public static DLUsuarios Instance
        {
            get
            {
                if (instance == null)
                    instance = new DLUsuarios();
                return instance;
            }
        }

        private DLUsuarios()
        {
            string cadenaConexion = ConfigurationManager.ConnectionStrings["conexionSQLExpress"].ConnectionString;
            this.connection = new SqlConnection(cadenaConexion); 
        }


        #endregion


        //###############################################################################
        //##########                          MÉTODOS                          ##########
        //###############################################################################


        /// <summary>
        /// Comprueba si existe un usuario con su respectiva contraseña en la base de datos.
        /// </summary>
        /// <param name="usuario">Usuario a comprobar</param>
        /// <param name="password">Password a comprobar</param>
        /// <returns>True en caso de que exista</returns>
        public bool ExisteUsuario(string usuario, string password)
        {
            int instancias;

            string buscar_usuario = "SELECT COUNT(*) FROM CLIENTES WHERE NOMBRE=@user AND PASSWORD=@pass";
            SqlCommand command_buscar_usuario = new SqlCommand(buscar_usuario, this.connection);

            try
            {
                this.connection.Open();
                command_buscar_usuario.Parameters.Add("@user", SqlDbType.VarChar,usuario.Length).Value = usuario;
                command_buscar_usuario.Parameters.Add("@pass", SqlDbType.VarChar,password.Length).Value = password;

                instancias = (int)command_buscar_usuario.ExecuteScalar();
                if (instancias > 0) return true;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                this.connection.Close();
            }


            return false;
        }


        /// <summary>
        /// Comprueba si el nombre de un usuario que esta registrado en la base de datos.
        /// </summary>
        /// <param name="usuario">Nombre del usuario a comprobar</param>
        /// <returns>True si el nombre ya existe.</returns>
        public bool ExisteUsuario(string usuario)
        {
            int instancias;

            string buscar_usuario = "SELECT COUNT(*) FROM CLIENTES WHERE NOMBRE=@user";
            SqlCommand command_buscar_usuario = new SqlCommand(buscar_usuario, this.connection);

            try
            {
                this.connection.Open();
                command_buscar_usuario.Parameters.Add("@user", SqlDbType.VarChar, usuario.Length).Value = usuario;

                instancias = (int)command_buscar_usuario.ExecuteScalar();
                if (instancias > 0) return true;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                this.connection.Close();
            }


            return false;
        }


        /// <summary>
        /// Añade a la base de datos un nuevo registro de cliente.
        /// </summary>
        /// <param name="usuario">Usuario a añadir</param>
        /// <param name="password">Contraseña del usuario</param>
        /// <returns>True si se añade con exito.</returns>
        public bool NuevoUsuario(string usuario, string password)
        {
            int instancias;

            string anadir_usuario = "INSERT INTO CLIENTES (NOMBRE,PASSWORD,FECHAREGISTRO) VALUES (@user,@pass,@fecha)";
            SqlCommand command_anadir_usuario = new SqlCommand(anadir_usuario, this.connection);

            try
            {
                this.connection.Open();
                command_anadir_usuario.Parameters.Add("@user", SqlDbType.VarChar, usuario.Length).Value = usuario;
                command_anadir_usuario.Parameters.Add("@pass", SqlDbType.VarChar, password.Length).Value = password;
                command_anadir_usuario.Parameters.Add("@fecha", SqlDbType.VarChar, 50).Value = DateTime.Today.ToString();

                instancias = command_anadir_usuario.ExecuteNonQuery();
                if (instancias > 0) return true;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                this.connection.Close();
            }


            return false;
        }

    }
}
